package com.shujia.mr.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable> {
    /*
        写MapReduce代码处理时，需要先定义数据的处理逻辑
        编写流程：
            4.对于Reduce过程，需要将相同Key的数据拉去到同一个ReduceTask中进行统计
                需要自定义一个WordCountReducer类 继承MapReduce中的Reduce类
                    Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
                   KEYIN, VALUEIN 表示Map端输出的数据 可以直接复制Map端输出
                   KEYOUT, VALUEOUT 表示Reduce端输出的数据 -> 写入到HDFS中的数据格式

                   KEYOUT：一个单词  Java中的String类型 -Hadoop序列化-> Hadoop中的Text类型
                   VALUEOUT：对应一个单词出现的次数  Java中的int类型 -Hadoop序列化-> IntWritable类型

           5.写reduce函数
                遍历迭代器中的所有Value值 -> 累加Value值 -> 单词和Value值 写出到HDFS中

     */

    /**
     *
     * @param key 一个单词
     * @param values 一个单词中所有的 标记数据 1  Iterable 类型是一个迭代器
     * @param context 上下文对象，可以将数据写出到HDFS中
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//        super.reduce(key, values, context);

        int cnt = 0;
        for (IntWritable value : values) {
            int flagOne = value.get();
            cnt += flagOne;
        }
        // 将结果进行包装，写出到HDFS中
        context.write(key,new IntWritable(cnt));

    }
}
